/*
** 2012 May 28
**
** The author disclaims copyright to this source code. In place of
** a legal notice, here is a blessing:
** May you do good and not evil.
** May you find forgiveness for yourself and forgive others.
** May you share freely, never taking more than you give.
*/
package info.ata4.bspsrc.modules;
import info.ata4.bsplib.BspFileReader;
import info.ata4.bsplib.lump.Lump;
import info.ata4.bsplib.lump.LumpType;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.CRC32;
import java.util.zip.CheckedInputStream;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.output.NullOutputStream;
/**
* BSP checksum calculator based on Source's server map CRC check.
*
* @author Nico Bergemann <barracuda415 at yahoo.de>
*/
public class BspChecksum extends ModuleRead {
public BspChecksum(BspFileReader reader) {
super(reader);
}
public long getMapCRC() throws IOException {
CRC32 crc = new CRC32();
// CRC across all lumps except for the Entities lump
for (Lump lump : bspFile.getLumps()) {
if (lump.getType() == LumpType.LUMP_ENTITIES) {
continue;
}
try (InputStream in = new CheckedInputStream(lump.getInputStream(), crc)) {
// copy to /dev/null, we need the checksum only
IOUtils.copy(in, new NullOutputStream());
}
}
return crc.getValue();
}
public long getFileCRC() throws IOException {
return FileUtils.checksumCRC32(bspFile.getFile().toFile());
}
}